#include <bits/stdc++.h>
using namespace std;
const int N=105;
char s[N];
//dp[i][j]表示[i,j]最小折叠长度
int dp[N][N];
int cal(int x){
    int t=0;
    while(x){
        t++;
        x/=10;
    }
    return t;
}
//判断[l,r]能否由[cl,cr]重复而成
bool judge(int l,int r,int cl,int cr){
    //长度不能整除
    if((r-l+1)%(cr-cl+1)!=0){
        return false;
    }
    //枚举右部分每一个字符
    for(int i=l;i<=r;i++){
        //按顺序判断,注意取模
        //右边部分可能有多个左边部分
        if(s[i]!=s[(i-l)%(cr-cl+1)+cl]){
            return false;
        }
    }
    return true;
}
int solve(int l,int r){
    if(l==r){
        return 1;
    }
    if(dp[l][r]){
        return dp[l][r];
    }
    int t=r-l+1;
    //枚举断点
    for(int i=l;i<r;i++){
        t=min(t,solve(l,i)+solve(i+1,r));
        if(judge(i+1,r,l,i)){
            //+solve(l,i)折叠后那部分的长度
            //+2两个括号
            //+get()折叠后数字的长度
            t=min(t,solve(l,i)+2+cal((r-i)/(i-l+1)+1));
        }
    }
    return dp[l][r]=t;
}
int main(void){
    scanf("%s",s);
    int len=strlen(s);
    printf("%d\n",solve(0,len-1));
    return 0;
}